1 package edu.jiangxin.apktoolbox.file.password.recovery.checker;
2
3 import edu.jiangxin.apktoolbox.file.password.recovery.exception.UnknownException;
4 import net.lingala.zip4j.exception.ZipException;
5 import net.lingala.zip4j.io.inputstream.ZipInputStream;
6
7 import java.io.FileInputStream;
8 import java.io.IOException;
9 import java.nio.charset.StandardCharsets;
10
11 public final class ZipChecker extends FileChecker {
12 private static final boolean DEBUG = false;
13
14 public ZipChecker() {
15 super();
16 }
17
18 @Override
19 public String[] getFileExtensions() {
20 return new String[]{"zip"};
21 }
22
23 @Override
24 public String getFileDescription() {
25 return "*.zip";
26 }
27
28 @Override
29 public String getDescription() {
30 return "ZIP Checker(Not support Non-ASCII password)";
31 }
32
33 @Override
34 public boolean prepareChecker() {
35 return true;
36 }
37
38 @Override
39 public boolean checkPassword(String password) {
40 if (DEBUG) {
41 logger.info("checkPassword: " + password);
42 }
43 boolean result = false;
44 byte[] readBuffer = new byte[4096];
45 try (ZipInputStream zipInputStream = new ZipInputStream(new FileInputStream(file), password.toCharArray(), StandardCharsets.UTF_8)) {
46 while (zipInputStream.getNextEntry() != null) {
47 while (zipInputStream.read(readBuffer) != -1) {
48
49 }
50 }
51 result = true;
52 } catch (ZipException e) {
53 if (DEBUG) {
54 logger.error("checkPassword: ", e.getClass());
55 }
56 } catch (IOException e) {
57 throw new UnknownException(e);
58 }
59 return result;
60 }
61 }